/**
 * 节流函数
 * @param fn 方法
 * @param delay 限制时间，单位毫秒，默认1500毫秒
 * @description 在一定时间间隔内只执行一次函数。如果在该时间间隔内多次触发函数，
 * 只有第一次触发会立即执行函数，而后续触发会被忽略，直到时间间隔过去后才能再次触发函数
 * @author meow
 * @example 若原函数为 fn(param)，则节流后的函数为 const fnThrottle = throttle(fn,1000)，调用节流后的函数：fnThrottle(param)
 * @return 节流后的函数
 */
export const throttle = (fn: Function, delay: number = 1500): Function => {
  let timerId: ReturnType<typeof setTimeout> | undefined
  let shouldExecute: boolean = true

  return (...args: any[]) => {
    if (!shouldExecute) {
      return
    }

    fn.apply(this, args)
    shouldExecute = false
    clearTimeout(timerId)

    timerId = setTimeout(() => {
      shouldExecute = true
    }, delay)
  }
}






